/*!
 * \file WtSelStraFact.cpp
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader SEL选股策略工厂实现文件
 * 
 * \details 该文件实现了WtSelStraFact类的完整功能，提供SEL选股策略的工厂管理服务：
 *          
 *          核心功能实现：
 *          - C接口导出：支持动态库加载和插件化使用
 *          - 策略创建：根据策略名称创建具体选股策略实例
 *          - 策略销毁：安全释放策略实例和相关资源
 *          - 策略枚举：列出工厂支持的所有选股策略类型
 *          - 工厂标识：提供唯一的工厂名称
 *          
 *          支持的策略：
 *          - DualThrustSelection：双推选股策略，适合量化选股应用
 *          - 其他自定义SEL策略（可扩展）
 *          
 *          选股策略特性：
 *          - 多品种管理：策略实例化和管理优化
 *          - 数据处理：高效的多品种数据处理引擎
 *          - 插件化架构：支持动态加载和卸载
 *          - 异常安全：完善的错误处理和资源管理
 *          
 *          作为选股交易系统的重要组件，支持策略的动态加载和管理
 */

#include "WtSelStraFact.h"
#include "WtStraDtSel.h"

#include <string.h>
#include <boost/config.hpp>

const char* FACT_NAME = "WtSelStraFact";	/*!< 工厂名称常量 */

/*!
 * \brief C接口导出函数
 * 
 * \details 提供标准C接口，便于动态库加载和插件化使用
 */
extern "C"
{
	/*!
	 * \brief 创建选股策略工厂实例
	 * \return ISelStrategyFact接口指针
	 * 
	 * \details 创建SEL选股策略工厂的新实例，用于策略管理：
	 *          - 返回基类接口指针，便于多态使用
	 *          - 调用者负责通过deleteSelStrategyFact释放资源
	 *          - 支持选股策略的特殊优化
	 */
	EXPORT_FLAG ISelStrategyFact* createSelStrategyFact()
	{
		ISelStrategyFact* fact = new WtSelStraFact();
		return fact;
	}

	/*!
	 * \brief 删除选股策略工厂实例
	 * \param fact 要删除的工厂实例指针
	 * 
	 * \details 安全删除选股策略工厂实例并释放相关资源：
	 *          - 检查指针有效性，防止空指针删除
	 *          - 清理工厂管理的所有选股策略资源
	 *          - 确保多品种数据订阅正确释放
	 */
	EXPORT_FLAG void deleteSelStrategyFact(ISelStrategyFact* fact)
	{
		if (fact != NULL)
			delete fact;
	}
};

/*!
 * \brief 构造函数
 * 
 * \details 初始化选股策略工厂，设置默认状态
 */
WtSelStraFact::WtSelStraFact()
{
}

/*!
 * \brief 析构函数
 * 
 * \details 清理工厂资源，确保所有选股策略实例被正确释放
 */
WtSelStraFact::~WtSelStraFact()
{
}

/*!
 * \brief 创建选股策略实例
 * \param name 策略名称
 * \param id 策略实例ID
 * \return 创建的策略实例指针，失败返回NULL
 * 
 * \details 根据策略名称创建对应的选股策略实例：
 *          - "DualThrustSelection"：创建双推选股策略实例
 *          - 不支持的策略名称返回NULL
 *          - 每个策略实例具有唯一的ID标识
 *          - 调用者负责通过deleteStrategy释放策略实例
 *          
 *          选股策略特殊考虑：
 *          - 多品种数据管理：需要处理大量品种的数据订阅
 *          - 计算资源优化：减少不必要的重复计算
 *          - 内存管理：合理缓存多品种数据
 */
SelStrategy* WtSelStraFact::createStrategy(const char* name, const char* id)
{
	if (strcmp(name, "DualThrustSelection") == 0)
		return new WtStraDtSel(id);

	return NULL;
}

/*!
 * \brief 删除选股策略实例
 * \param stra 要删除的策略实例指针
 * \return 删除成功返回true，失败返回false
 * 
 * \details 安全删除选股策略实例并释放相关资源：
 *          - 检查策略指针有效性
 *          - 验证策略是否属于本工厂创建
 *          - 停止所有品种的数据订阅
 *          - 清理选股计算缓存和组合数据
 *          - 执行安全删除操作
 *          - 防止删除其他工厂创建的策略实例
 *          
 *          选股策略特殊处理：
 *          - 确保所有品种的数据订阅被正确取消
 *          - 释放多品种技术指标计算缓存
 *          - 清理选股结果和组合配置数据
 */
bool WtSelStraFact::deleteStrategy(SelStrategy* stra)
{
	if (stra == NULL)
		return true;

	if (strcmp(stra->getFactName(), FACT_NAME) != 0)
		return false;

	delete stra;
	return true;
}

/*!
 * \brief 枚举工厂支持的选股策略
 * \param cb 枚举回调函数
 * 
 * \details 通过回调函数列出工厂支持的所有选股策略类型：
 *          - "DualThrustSelection"：双推选股策略，基于DualThrust算法的多品种选股
 *          
 *          回调参数说明：
 *          - 参数1：工厂名称
 *          - 参数2：策略名称
 *          - 参数3：是否为扩展策略（true表示高级功能）
 *          
 *          选股策略特点：
 *          - 多品种并行：同时分析多个投资标的
 *          - 量化筛选：基于数学模型进行选股
 *          - 动态调整：根据市场变化调整组合
 *          - 风险分散：通过多样化降低投资风险
 */
void WtSelStraFact::enumStrategy(FuncEnumSelStrategyCallback cb)
{
	cb(FACT_NAME, "DualThrustSelection", true);
}

/*!
 * \brief 获取工厂名称
 * \return 工厂名称字符串
 * 
 * \details 返回该工厂的唯一标识名称，用于：
 *          - 区分不同的选股策略工厂
 *          - 策略实例的归属验证
 *          - 日志记录和错误诊断
 */
const char* WtSelStraFact::getName()
{
	return FACT_NAME;
}